package com.qf.consumer;

import com.qf.dao.ProductDao;
import com.qf.dao.impl.ProductDaoImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Description: 公用常量
 * @Data: 2022/8/31 15:02
 * @Pacakge: com.qf.consumer
 * @ClassName: Consumer
 * @Author: fan
 */
public class Consumer {
    public static void main(String[] args) {
        //从商家直接购买商品
        final ProductDao productDao = new ProductDaoImpl();
        productDao.buyProduct("厂家");
        /**
         * 模拟让代理购买商品 对目标类进行增强操作
         *第一个参数:类加载器 目标类的类加载器 目标对象.getClass().getClassLoader()
         *第二个参数:字节码数组 (目标对象实现的接口的字节码) 目标对象.getClass.getInterfaces() 获取目标类所实现的接口
         *第三个参数:增强业务逻辑
         */
        ProductDao proxy
                = (ProductDao) Proxy.newProxyInstance(productDao.getClass().getClassLoader(),
                productDao.getClass().getInterfaces(),
                new InvocationHandler() {
                    /**
                     * 执行被代理接口的任何方法,都会执行该方法
                     * @param proxy 当前代理对象的引用,一般使用较少
                     * @param method 当前执行的方法
                     * @param args 当前执行方法需要的参数
                     * @return 和被代理对象一样的返回值
                     * @throws Throwable
                     */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                if ("buyProduct".equals(method.getName())){
                    method.invoke(productDao,args);
                }
                if ("afterSales".equals(method.getName())){
                    method.invoke(productDao,args);
                }
                return null;
            }
        });
//        proxy.buyProduct("代理商");
        proxy.afterSales("代理商");
    }
}
